package com.webchat.pgc.repository.dao.sys;

import com.webchat.pgc.repository.entity.sys.SysDataDictionary;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;


@Repository
public interface ISysDataDictionaryDAO extends JpaRepository<SysDataDictionary, Long> {


    /**
     * 按分类 ID 进行非重复计数
     *
     * @param categoryId 分类 ID
     * @return long
     */
    long countDistinctByCategoryId(Long categoryId);

    /**
     * 根据编码计数
     *
     * @param code 编码
     * @return long
     */
    long countDistinctByCode(String code);
    /**
     * 根据名称计数
     *
     * @param name 名称
     * @return long
     */
    long countDistinctByName(String name);
    /**
     * 根据编码计数
     *
     * @param code 编码
     * @param id ID
     * @return long
     */
    long countDistinctByCodeAndIdNot(String code, Long id);
    /**
     * 根据名称计数
     *
     * @param name 名称
     * @param id ID
     * @return long
     */
    long countDistinctByNameAndIdNot(String name, Long id);

    /**
     * 根据编码查询单个
     *
     * @param code 法典
     * @return {@link SysDataDictionary }
     */
    SysDataDictionary findOneByCode(String code);

    /**
     * 根据编码和名称模糊查询分页（支持 null 条件）
     *
     * @param categoryId     分类 ID
     * @param code     编码
     * @param name     名称
     * @param pageable 分页参数
     * @return {@link Page }<{@link SysDataDictionary }>
     */
    @Query("SELECT c FROM SysDataDictionary c WHERE (:categoryId IS NULL OR c.categoryId = :categoryId) AND (:code IS NULL OR c.code = :code) AND (:name IS NULL OR c.name LIKE %:name%)")
    Page<SysDataDictionary> findByCategoryIdAndCodeAndNameLike(@Param("categoryId") Long categoryId,
                                                               @Param("code") String code,
                                                               @Param("name") String name,
                                                               Pageable pageable);

}
